package com.snake;

import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.RectF;

// 蛇身
class SnakeBody {
    // 类型
    public enum Type {
        APPLE,  // 果子
        SNAKE   // 蛇
    }

    private int mColor;             // 颜色
    private final Canvas mDrawer;   // 绘图者
    private SnakeBody mNext;        // 下一个蛇身
    private final Paint mPaint;     // 绘图相关信息
    private final Point mPosition;  // 位置

    /**
     * 构造方法。
     * @param drawer    绘图者
     * @param point     位置
     * @param type      类型
     */
    public SnakeBody(Canvas drawer, Point point, Type type) {
        // 初始化成员
        mDrawer = drawer;
        mPaint = new Paint();
        mPosition = point;

        // 设置类型
        this.setType(type);
        
        // 画自身
        this.draw();
    }

    /**
     * 画自身。
     */
    public void draw() {
        mPaint.setStyle(Paint.Style.FILL);
        mPaint.setColor(mColor);
        final RectF oval = new RectF(mPosition.x * Const.GRID_SIZE, mPosition.y * Const.GRID_SIZE,
            (mPosition.x + 1) * Const.GRID_SIZE, (mPosition.y + 1) * Const.GRID_SIZE);
        mDrawer.drawOval(oval, mPaint);
    }

    /**
     * 将蛇身从原来的位置中抹除。
     */
    public void erase() {
        mPaint.setStyle(Paint.Style.FILL);
        mPaint.setColor(Const.GAME_BOARD_COLOR);
        mDrawer.drawRect(mPosition.x * Const.GRID_SIZE, mPosition.y * Const.GRID_SIZE,
          (mPosition.x + 1) * Const.GRID_SIZE, (mPosition.y + 1) * Const.GRID_SIZE, mPaint);
    }

    /**
     * 获取下一个蛇身。
     * @return 下一个蛇身
     */
    public SnakeBody getNext() {
        return mNext;
    }

    /**
     * 获取位置。
     * @return 位置
     */
    public Point getPosition() {
        return mPosition;
    }

    /**
     * 设置下一个蛇身。
     * @param snakeBody 蛇身
     */
    public void setNext(SnakeBody snakeBody) {
        mNext = snakeBody;
    }

    /**
     * 设置位置。
     * @param position  位置
     */
    public void setPosition(Point position) {
        mPosition.x = position.x;
        mPosition.y = position.y;
    }
    
    /**
     * 设置类型。
     * @param type  类型
     */
    public void setType(Type type) {
        if (type == Type.SNAKE) {
            mColor = Const.SNAKE_COLOR;
        } else {
            mColor = Const.APPLE_COLOR;
        }
    }
}
